home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / Mesa-2.2 / src-aux / vect3d.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-05  |  3.0 KB  |  169 lines

  1. /* vect3d.c */
  2.  
  3. /* Routines to manipulate 3 dimensional vectors.  All these routines
  4.  * should work even if the input and output vectors are the same.
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10. #include <GL/gl.h>
  11. #include "3d.h"
  12.  
  13. #if defined(__cplusplus) || defined(c_plusplus)
  14. #define class c_class
  15. #endif
  16.  
  17. void (*errfunc)(char *) = 0;
  18.  
  19. void seterrorfunc(void (*func)(char *))
  20. {
  21.     errfunc = func;
  22. }
  23.  
  24. void error(char *s)
  25. {
  26.     if (errfunc)
  27.     (*errfunc)(s);
  28.     else {
  29.     fprintf(stderr, s); 
  30.     fprintf(stderr, "\n");
  31.     exit(1);
  32.     }
  33. }
  34.  
  35. void diff3(GLdouble p[3], GLdouble q[3], GLdouble diff[3])
  36. {
  37.     diff[0] = p[0] - q[0];
  38.     diff[1] = p[1] - q[1];
  39.     diff[2] = p[2] - q[2];
  40. }
  41.  
  42. void add3(GLdouble p[3], GLdouble q[3], GLdouble sum[3])
  43. {
  44.     sum[0] = p[0] + q[0];
  45.     sum[1] = p[1] + q[1];
  46.     sum[2] = p[2] + q[2];
  47. }
  48.  
  49. void scalarmult(GLdouble s, GLdouble v[3], GLdouble vout[3])
  50. {
  51.     vout[0] = v[0]*s;
  52.     vout[1] = v[1]*s;
  53.     vout[2] = v[2]*s;
  54. }
  55.  
  56. GLdouble dot3(GLdouble p[3], GLdouble q[3])
  57. {
  58.     return p[0]*q[0] + p[1]*q[1] + p[2]*q[2];
  59. }
  60.  
  61. GLdouble length3(GLdouble v[3])
  62. {
  63.     return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
  64. }
  65.  
  66. GLdouble dist3(GLdouble p[3], GLdouble q[3])
  67. {
  68.     GLdouble d[3];
  69.  
  70.     diff3(p, q, d);
  71.     return length3(d);
  72. }
  73.  
  74. void copy3(GLdouble old[3], GLdouble new_c[3])
  75. {
  76.     new_c[0] = old[0], new_c[1] = old[1], new_c[2] = old[2];
  77. }
  78.  
  79. void crossprod(GLdouble v1[3], GLdouble v2[3], GLdouble prod[3])
  80. {
  81.     GLdouble p[3];    /* in case prod == v1 or v2 */
  82.  
  83.     p[0] = v1[1]*v2[2] - v2[1]*v1[2];
  84.     p[1] = v1[2]*v2[0] - v2[2]*v1[0];
  85.     p[2] = v1[0]*v2[1] - v2[0]*v1[1];
  86.     prod[0] = p[0]; prod[1] = p[1]; prod[2] = p[2];
  87. }
  88.  
  89. void normalize(GLdouble v[3])
  90. {
  91.     GLdouble d;
  92.  
  93.     d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
  94.     if (d == 0.0) {
  95.         error("normalize: zero length vector");
  96.     v[0] = d = 1.0;
  97.     }
  98.     d = 1/d;
  99.     v[0] *= d; v[1] *= d; v[2] *= d;
  100. }
  101.  
  102. void print3(GLdouble v[3])
  103. {
  104.     GLdouble len;
  105.  
  106.     len = length3(v);
  107.     printf("(%g %g %g); len: %g\n", v[0], v[1], v[2], len);
  108. }
  109.  
  110. void printmat3(GLdouble m[3][3])
  111. {
  112.     int i, j;
  113.  
  114.     for (i=0; i<3; i++) {
  115.     for (j=0; j<3; j++)
  116.         printf("%7.4f  ", m[i][j]);
  117.     printf("\n");
  118.     }
  119. }
  120.  
  121. void identifymat3(GLdouble m[3][3])
  122. {
  123.     int i, j;
  124.  
  125.     for (i=0; i<3; i++)
  126.     for (j=0; j<3; j++)
  127.         m[i][j] = (i == j) ? 1.0 : 0.0;
  128. }
  129.  
  130. void copymat3(GLdouble *to, GLdouble *from)
  131. {
  132.     int i;
  133.  
  134.     for (i=0; i<9; i++) {
  135.     *to++ = *from++;
  136.     }
  137. }
  138.  
  139. void xformvec3(GLdouble v[3], GLdouble m[3][3], GLdouble vm[3])
  140. {
  141.     GLdouble result[3];    /* in case v == vm */
  142.     int i;
  143.  
  144.     for (i=0; i<3; i++) {
  145.     result[i] = v[0]*m[0][i] + v[1]*m[1][i] + v[2]*m[2][i];
  146.     }
  147.     for (i=0; i<3; i++) {
  148.     vm[i] = result[i];
  149.     }
  150. }
  151.  
  152. long samepoint(GLdouble p1[3], GLdouble p2[3])
  153. {
  154.     if (p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2])
  155.     return 1;
  156.     return 0;
  157. }
  158.  
  159. void perpnorm(GLdouble p1[3], GLdouble p2[3], GLdouble p3[3], GLdouble n[3])
  160. {
  161.     GLdouble d1[3], d2[3];
  162.  
  163.     diff3(p2, p1, d1);
  164.     diff3(p2, p3, d2);
  165.     crossprod(d1, d2, n);
  166.     normalize(n);
  167. }
  168.  
  169.